package com.java8.demo01_default_of_interface;

import org.junit.Test;
import sun.nio.cs.ext.MacThai;


/**
 * Created by liuburu on 2017/6/8.
 */
public class Java8Test {

    /**
     * 公式接口（Formula：美 /ˈfɔːrmjələ/）
     */
    interface Formula {
        /**
         * 普通方法
         */
        double calculate(int a);

        /**
         * 接口中的默认实现方法（开根号）
         */
        default double sqrt(int a) {
            System.out.println("interface(Formula)中开根号");
            return Math.sqrt(a);
        }

        /**
         * 接口中含有静态方法
         */
        static double plus(int a, int b) {
            return a + b;
        }
    }

    /**
     * 数学运算类
     */
    class Mathematics {
        /**
         * 接口中的默认实现方法（开根号）
         */
        public double sqrt(int a) {
            System.out.println("class(Mathematics)中开根号");
            return Math.sqrt(a);
        }
    }

    /**
     * 测试1：调用接口的默认实现方法
     */
    @Test
    public void test1() {
        Formula formula = new Formula() {
            @Override
            public double calculate(int a) {
                return sqrt(a);
            }
        };
        double r1 = formula.calculate(100);     // 10.0
        double r2 = formula.sqrt(16);           // 4.0
        double r3 = Formula.plus(1, 3);      //4.0
        System.out.println("r1=" + r1);
        System.out.println("r2=" + r2);
        System.out.println("r3=" + r3);
    }

    /**
     * 测试2：复写接口的default方法
     */
    @Test
    public void test2() {
        Formula formula = new Formula() {
            @Override
            public double calculate(int a) {
                return a * a;
            }

            //复写父类默认接口实现方法
            @Override
            public double sqrt(int a) {
                return 1 + 2;
            }
        };
        double sqrt = formula.sqrt(9);
        System.out.println(sqrt);// 3.0
    }

    class MyFormula extends Mathematics implements Formula {

        @Override
        public double calculate(int a) {
            return 0;
        }
    }

    /**
     * 测试2：接口和继承的父类中方法名相同，先执行父类方法。
     */
    @Test
    public void test3() {
        MyFormula myFormula = new MyFormula();
        double result = myFormula.sqrt(100);
        System.out.println("result=" + result);
        /**
         * class中开根号
         * result=10.0
         */
    }

    /**
     * 第三方接口（OtherFormula：美 /ˈfɔːrmjələ/）
     */
    interface OtherFormula {
        /**
         * 接口中的默认实现方法（开根号）
         */
        default double sqrt(int a) {
            System.out.println("interface(OtherFormula)中开根号");
            return Math.sqrt(a);
        }
    }

    class MyFormulaPlus implements Formula,OtherFormula {

        @Override
        public double calculate(int a) {
            return 0;
        }

        @Override
        public double sqrt(int a) {
            return OtherFormula.super.sqrt(a);
        }

    }

    /**
     * 测试2：接口和继承的父类中方法名相同，先执行父类方法。
     */
    @Test
    public void test4() {
        MyFormula myFormula = new MyFormula();
        double result = myFormula.sqrt(100);
        System.out.println("result=" + result);
        /**
         * class中开根号
         * result=10.0
         */
    }


}
